﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Utility.Contracts;
using Utility.Data.DbClient;

namespace Utility.DBUtility.ORM
{
    /// <summary>
    /// 实体类操作方法接口
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IRepository<T> : IDependency
    {
        #region 事务处理
        /// <summary>
        /// 事务ID,作为事务开启和关闭的ID号
        /// </summary>
        string Transactionid { get; set; }
        /// <summary>
        /// 开启事务, 使用事务必须设定每个Data实例的 Transactionid. 相同的Transactionid 才会在一个事务中提交
        /// 一个Data实例开启事务,相同 Transactionid 的Data实例都将使用到事务
        /// [目前不支持存储过程放入事务中]
        /// </summary>
        /// <param name="connectionString"></param>
        /// <param name="isolationLevel">事务开启级别</param>
        /// <returns>
        /// 返回事务ID,作为事务开启和关闭的ID号,同时也作为其它Data使用的数据库连接ID与事务ID
        /// </returns>
        string BeginTransaction(string connectionString = "", IsolationLevel isolationLevel = IsolationLevel.ReadCommitted);
        /// <summary>
        /// 提交事务
        /// 提交事务后,将清空链接对象
        /// </summary>
        void Commit();
        /// <summary>
        /// 回滚事务
        /// 回滚事务后,将清空链接对象
        /// </summary>
        void Rollback();

        #endregion
        /// <summary>
        /// 表信息
        /// </summary>
        ORM.EntityAttribute.DbTableAttribute DbTableAttribute { get; }
        /// <summary>
        /// 插入或者更新,
        /// 根据主键进行查找数据. 没有则插入,有则更新,
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        int AddOrUpdate(T model);
        /// <summary>
        /// 插入或者更新,
        /// 根据主键进行查找数据. 没有则插入,有则更新,
        /// </summary>
        /// <param name="models"></param>
        /// <param name="action">
        /// 处理进度
        /// string: 当前处理的类型
        /// int1: 总数据量
        /// int2: 当前处理量
        /// </param>
        /// <returns></returns>
        int AddOrUpdate(List<T> models, Action<string, int, int> action = null);
        /// <summary>
        /// 添加Model list
        /// </summary>
        /// <param name="models"></param>
        /// <param name="action">
        /// 处理进度
        /// string: 当前处理的类型
        /// int1: 总数据量
        /// int2: 当前处理量
        /// </param>
        /// <returns></returns>
        int Add(List<T> models, Action<string, int, int> action = null);
        /// <summary>
        /// 增加一条数据
        /// </summary>
        int Add(T model);
        /// <summary>
        /// 更新一条数据[需要Model的 主键设定值]
        /// </summary>
        int Update(T model);
        /// <summary>
        /// 更新 Model list
        /// </summary>
        /// <param name="models"></param>
        /// <param name="action">
        /// 处理进度
        /// string: 当前处理的类型
        /// int1: 总数据量
        /// int2: 当前处理量
        /// </param>
        /// <returns></returns>
        int Update(List<T> models, Action<string, int, int> action = null);
        /// <summary>
        /// 删除一条数据[需要Model的 主键设定值]
        /// </summary>
        int Delete(T model);
        /// <summary>
        /// 删除一条数据[需要Model的 主键设定值]
        /// </summary>
        /// <param name="action">
        /// <param name="models"></param>
        /// 处理进度
        /// string: 当前处理的类型
        /// int1: 总数据量
        /// int2: 当前处理量
        /// </param>
        int Delete(List<T> models, Action<string, int, int> action = null);
        /// <summary>
        /// 查找数据[根据设置的Model值作为查询条件,进行选择]
        /// </summary>
        /// <param name="model"></param>
        /// <param name="isClearChanges">是否清除项次改变值</param>
        /// <returns></returns>
        T GetModel(T model, bool isClearChanges = true);
        /// <summary>
        /// 获取数据列
        /// </summary>
        List<T> GetList();
        /// <summary>
        /// 获取数据列,根据设定的Model值进行查询
        /// </summary>
        List<T> GetList(T model);
        /// <summary>
        /// 获取数据列,根据设定的Model值进行查询
        /// </summary>
        /// <param name="model"></param>
        /// <param name="orderBy">MS-SQLSERVER 必填字段,其它数据库不要求</param>
        /// <param name="totalCount"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <returns></returns>
        List<T> GetList(T model, string orderBy, out int totalCount, int pageIndex = 1, int pageSize = 20);
        /// <summary>
        /// 获取数据列,根据自定义条件进行查询
        /// </summary>
        /// <param name="sqlWhere"></param>
        /// <param name="orderBy">MS-SQLSERVER 必填字段,其它数据库不要求</param>
        /// <param name="totalCount"></param>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="cmdParms"></param>
        /// <returns></returns>
        List<T> GetList(string sqlWhere, string orderBy, out int totalCount, int pageIndex = 1, int pageSize = 20, params DBParameter[] cmdParms);
        /// <summary>
        /// 是否存在指定条件的数据[需要Model的 主键设定值]
        /// </summary>
        bool Exists(T model);
        /// <summary>
        /// 软删除数据[需要Model的 主键设定值]
        /// </summary>
        int SoftDelete(T model);        
    }
}
